package utils

import (
	businessError "sg-backend/error"
	"sg-backend/global"
	"sg-backend/model/user"
)

/*
 * 使用方式：	utils.CheckPermsByTag(ctx, "user", "update")
 */

func CheckPermsByTag(permsTag string, userId uint, permsType string) bool {

	anyPerms := []string{"Home", "Payment", "Income", "Owe", "Lend"}
	for _, v := range anyPerms {
		if permsTag == v {

			// 以上四个模块，不设权限控制，只要登录就有权限
			return true
		}
	}

	// 从获取用户对象
	// 如果为0，则返回false
	if userId == 0 {
		return false
	}

	// 从获取用户对象
	var userObj = user.User{}
	global.DB.Preload("Role").Where("id = ?", userId).First(&userObj)

	// 默认权限标志为false
	hasPerms := false

	// 根据用户ID，请求的权限tag（全局唯一）验证用户权限
	// 1，验证用户自身的权限
	// 1.1 超管，直接通过，拥有所有权限
	if userObj.IsSuperuser == true {
		return true
	}

	// 1.2 验证授权
	// 根据权限tag获取菜单对象
	var _menu = user.Menu{}
	_menuResult := global.DB.Where("privilege_name = ?", permsTag).First(&_menu)
	if _menuResult.RowsAffected != 0 {

		// 匹配到菜单
		// 开始验证菜单授权
		var customPerm []user.Perms
		_customPerm := global.DB.Where("user_id = ? AND menu_id = ? AND type = ?", userId, _menu.Id, permsType).
			Find(&customPerm)
		if _customPerm.RowsAffected == 1 {

			// 匹配到权限分配记录，有权限
			hasPerms = true
			return hasPerms
		}
	}

	// 无权限，根据请求的类型，返回
	switch permsType {
	case "read":
		panic(businessError.New(businessError.NO_READ_PERMS))
	case "add":
		panic(businessError.New(businessError.NO_ADD_PERMS))
	case "update":
		panic(businessError.New(businessError.NO_UPDATE_PERMS))
	case "delete":
		panic(businessError.New(businessError.NO_DELETE_PERMS))
	default:
		panic(businessError.New(businessError.NO_PERMS))
	}

	// 默认返回无权限
	return false
}

// 非中间件使用，不panic
// 用户系统权限管理时匹配指定用户的全部权限

func CheckPermsByTagNoPanic(permsTag string, userId uint, permsType string) bool {
	anyPerms := []string{"Home", "Payment", "Income", "Owe", "Lend"}
	for _, v := range anyPerms {
		if permsTag == v {

			// 以上四个模块，不设权限控制，只要登录就有权限
			return true
		}
	}

	// 如果为0，则返回false
	if userId == 0 {
		return false
	}

	// 从获取用户对象
	var userObj = user.User{}
	global.DB.Preload("Role").Where("id = ?", userId).First(&userObj)

	// 根据用户ID，请求的权限tag（全局唯一）验证用户权限
	// 1，验证用户自身的权限
	// 1.1 超管，直接通过，拥有所有权限
	if userObj.IsSuperuser == true {
		return true
	}

	// 1.2 验证授权
	// 根据权限tag获取菜单对象
	var _menu = user.Menu{}
	_menuResult := global.DB.Where("privilege_name = ?", permsTag).First(&_menu)
	if _menuResult.RowsAffected != 0 {

		// 匹配到菜单
		// 开始验证菜单授权
		var customPerm []user.Perms
		_customPerm := global.DB.Where("user_id = ? AND menu_id = ? AND type = ?", userId, _menu.Id, permsType).
			Find(&customPerm)
		if _customPerm.RowsAffected == 1 {

			// 匹配到权限分配记录，有权限
			return true
		}
	}

	// 匹配不到权限，返回false
	return false
}

// CheckRolePerms 根据传入的角色ID，判断是否有权限访问
func CheckRolePerms(permsTag string, roleId uint, permsType string) bool {

	// 根据权限tag获取菜单对象
	_menu := user.Menu{}
	_menuResult := global.DB.Where("privilege_name = ?", permsTag).First(&_menu)
	if _menuResult.RowsAffected != 0 {

		// 匹配到菜单
		// 开始验证菜单授权
		// 开始验证菜单授权
		var customPerm []user.Perms
		_customPerm := global.DB.Where("role_id = ? AND menu_id = ? AND type = ?", roleId, _menu.Id, permsType).
			Find(&customPerm)
		if _customPerm.RowsAffected == 1 {

			// 匹配到权限分配记录，有权限
			return true
		}
	}

	// 默认返回无权限
	return false
}
